package main

import (
	"fmt"
	"os"

	"gorm.io/driver/mysql"
	"gorm.io/gen"
	"gorm.io/gorm"
)

func main() {
	// 1. 连接数据库
	dsn := "root:Root2025*@tcp(localhost:3306)/dev_db?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn))
	if err != nil {
		panic("failed to connect database")
	}
	// 2. 初始化生成器
	currentPath, _ := os.Getwd()
	fmt.Println("当前目录: ", currentPath)
	g := gen.NewGenerator(gen.Config{
		OutPath:      currentPath + "/gen/query", // 生成代码的输出路径
		ModelPkgPath: currentPath + "/gen/model", // 数据模型（结构体）的包路径
		//Mode:              gen.WithDefaultQuery | gen.WithQueryInterface, // 生成模式
		FieldNullable:     false, // 对于数据库表中nullable的数据，在生成代码中自动对应为指针类型
		FieldWithIndexTag: false, // 从数据库同步的表结构代码包含gorm的index tag
		FieldWithTypeTag:  false, // 同步的表结构代码包含gorm的type tag(数据库中对应数据类型)
	})
	// 3. 将数据库连接传递给生成器
	g.UseDB(db)
	// 4. 定义生成规则（可选）
	// 示例1：生成全部表
	//allTable := g.GenerateAllTable()
	// 示例2：指定表生成，并自定义结构体名
	// userTable := g.GenerateModel("users", gen.FieldJSONTag("snake_case")) // 表名映射为 users -> User
	// postTable := g.GenerateModelAs("posts", "Article") // 表名 posts 映射为结构体 Article
	// 5. 生成代码
	g.ApplyBasic(
		//users表
		g.GenerateModel("users",
			gen.FieldType("gender", "int32"),              // 将tinyint(1)的gender强制转为int32（避免默认bool）
			gen.FieldComment("gender", "性别：0-未知，1-男，2-女"), // 补充字段注释
		),
	)

	g.Execute()
}
